package com.special.requirement.shape;

/**
 * @author liuYC
 * @ClassName HShape
 * @Description TODO
 * @date 2021/5/6 17:05
 * 多态涉及到编译：
 * 什么叫多态：一个对象具备多种形态，也可以理解为事物存在的多种体现形态
 * （父类的引用类型变量指向了子类对象，或者是接口的引用类型变量指向了接口实现类的对象）
 * <p>
 * 总结：多态情况下，子父类存在同名的成员时，访问的都是父类成员，除了在同名非静态函数时才是访问子类的。
 * <p>
 * 编译看左边：java编译器在编译的时候，会检查引用类型变量所属的类是否具备指定的成员，
 * <p>
 * 需求1：
 * 定义一个函数，可以接受任意类型的图形对象，并且打印图形面积与周长
 * 可以看出我们的所谓的接收数据：
 * 多态的几种形式，就是这样额，或方法或接口：
 * 区别在于抽象类和接口
 */

abstract class MyShape {
    public abstract void getArea();

    public abstract void getLength();
}

class Circle extends MyShape {
    public static final double PI = 3.14;
    double r;

    public Circle(double r) {
        this.r = r;
    }

    public void getArea() {
        System.out.println("圆形的面积" + PI * r * r);
    }

    public void getLength() {
        System.out.println("圆的周长" + 2 * PI * r);
    }

}

class Rect extends MyShape {
    int width;
    int height;

    public Rect(int width, int height) {
        this.width = width;
        this.height = height;
    }

    public void getArea() {
        System.out.println("矩形的面积是" + width * height);
    }

    public void getLength() {
        System.out.println("矩形的周长是" + (width + height) * 2);
    }

}

public class HShape {
    public static void main(String[] args) {
        Circle c = new Circle(2.0);
//       所谓的接受任意的图形进行对应的展示的代码在这个位置：
        print(c);
        Rect rect = new Rect(4, 2);
        print(rect);
    }

    public static void print(MyShape s) {
        //MyShape s=new Circle(4.0);
        s.getArea();
        s.getLength();
    }
}
// todo 需求2：定义一个函数可以返回任意类型的图形对象。

class Demo5 {
    public static void main(String[] args) {
        MyShape m = getShape(1);//调用了使用多态，定义的变量类型要以返回值类型一致。
//        MyShape m=getShape(0);//调用了使用多态，定义的变量类型要以返回值类型一致。
        m.getArea();
        m.getLength();
    }

    public static MyShape getShape(int i) {
        if (i == 0) {
            return new Circle(4.0);
        } else {
            return new Rect(3, 4);
        }
    }
}
